home *** CD-ROM | disk | FTP | other *** search
/ PD Collection CD 1 / PD Collection CD 1.iso / textual / pdftops / xpdf / c++ / Object < prev    next >
Text File  |  1996-06-08  |  4KB  |  214 lines

  1. //========================================================================
  2. //
  3. // Object.cc
  4. //
  5. // Copyright 1996 Derek B. Noonburg
  6. //
  7. //========================================================================
  8.  
  9. #ifdef __GNUC__
  10. //#pragma implementation
  11. #endif
  12.  
  13. #include <stddef.h>
  14. #include <stdarg.h>
  15. #include "Object.h"
  16. #include "Array.h"
  17. #include "Dict.h"
  18. #include "Error.h"
  19. #include "Stream.h"
  20.  
  21. //------------------------------------------------------------------------
  22. // Object
  23. //------------------------------------------------------------------------
  24.  
  25. char *objTypeNames[numObjTypes] = {
  26.   "boolean",
  27.   "integer",
  28.   "real",
  29.   "string",
  30.   "name",
  31.   "null",
  32.   "array",
  33.   "dictionary",
  34.   "stream",
  35.   "ref",
  36.   "cmd",
  37.   "error",
  38.   "eof",
  39.   "none"
  40. };
  41.  
  42. #ifdef DEBUG_MEM
  43. int Object::numAlloc[numObjTypes] =
  44.   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  45. #endif
  46.  
  47. Object *Object::initArray() {
  48.   type = objArray;
  49.   array = new Array();
  50. #ifdef DEBUG_MEM
  51.   ++numAlloc[objArray];
  52. #endif
  53.   return this;
  54. }
  55.  
  56. Object *Object::initDict() {
  57.   type = objDict;
  58.   dict = new Dict();
  59. #ifdef DEBUG_MEM
  60.   ++numAlloc[objDict];
  61. #endif
  62.   return this;
  63. }
  64.  
  65. Object *Object::initStream(Stream *stream1) {
  66.   type = objStream;
  67.   stream = stream1;
  68. #ifdef DEBUG_MEM
  69.   ++numAlloc[objStream];
  70. #endif
  71.   return this;
  72. }
  73.  
  74. Object *Object::copy(Object *obj) {
  75.   *obj = *this;
  76.   switch (type) {
  77.   case objString:
  78.     obj->string = string->copy();
  79.     break;
  80.   case objName:
  81.     obj->name = copyString(name);
  82.     break;
  83.   case objArray:
  84.     array->incRef();
  85.     break;
  86.   case objDict:
  87.     dict->incRef();
  88.     break;
  89.   case objStream:
  90.     stream->incRef();
  91.     break;
  92.   case objCmd:
  93.     obj->cmd = copyString(cmd);
  94.     break;
  95.   default:
  96.     break;
  97.   }
  98. #ifdef DEBUG_MEM
  99.   ++numAlloc[type];
  100. #endif
  101.   return obj;
  102. }
  103.  
  104. void Object::free() {
  105.   switch (type) {
  106.   case objString:
  107.     delete string;
  108.     break;
  109.   case objName:
  110.     gfree(name);
  111.     break;
  112.   case objArray:
  113.     if (!array->decRef())
  114.       delete array;
  115.     break;
  116.   case objDict:
  117.     if (!dict->decRef())
  118.       delete dict;
  119.     break;
  120.   case objStream:
  121.     if (!stream->decRef())
  122.       delete stream;
  123.     break;
  124.   case objCmd:
  125.     gfree(cmd);
  126.     break;
  127.   default:
  128.     break;
  129.   }
  130. #ifdef DEBUG_MEM
  131.   --numAlloc[type];
  132. #endif
  133.   type = objNone;
  134. }
  135.  
  136. char *Object::getTypeName() {
  137.   return objTypeNames[type];
  138. }
  139.  
  140. void Object::print(FILE *f) {
  141.   Object obj;
  142.   int i;
  143.  
  144.   switch (type) {
  145.   case objBool:
  146.     fprintf(f, "%s", booln ? "true" : "false");
  147.     break;
  148.   case objInt:
  149.     fprintf(f, "%d", intg);
  150.     break;
  151.   case objReal:
  152.     fprintf(f, "%g", real);
  153.     break;
  154.   case objString:
  155.     fprintf(f, "(%s)", string->getCString());
  156.     break;
  157.   case objName:
  158.     fprintf(f, "/%s", name);
  159.     break;
  160.   case objNull:
  161.     fprintf(f, "null");
  162.     break;
  163.   case objArray:
  164.     fprintf(f, "[");
  165.     for (i = 0; i < arrayGetLength(); ++i) {
  166.       if (i > 0)
  167.     fprintf(f, " ");
  168.       arrayGet(i, &obj);
  169.       obj.print(f);
  170.       obj.free();
  171.     }
  172.     fprintf(f, "]");
  173.     break;
  174.   case objDict:
  175.     fprintf(f, "<dict>");
  176.     break;
  177.   case objStream:
  178.     fprintf(f, "<stream>");
  179.     break;
  180.   case objRef:
  181.     fprintf(f, "%d %d R", ref.num, ref.gen);
  182.     break;
  183.   case objCmd:
  184.     fprintf(f, "%s", cmd);
  185.     break;
  186.   case objError:
  187.     fprintf(f, "<error>");
  188.     break;
  189.   case objEOF:
  190.     fprintf(f, "<EOF>");
  191.   case objNone:
  192.     fprintf(f, "<none>");
  193.     break;
  194.   }
  195. }
  196.  
  197. void Object::memCheck(FILE *f) {
  198. #ifdef DEBUG_MEM
  199.   int i;
  200.   int t;
  201.  
  202.   t = 0;
  203.   for (i = 0; i < numObjTypes; ++i)
  204.     t += numAlloc[i];
  205.   if (t > 0) {
  206.     fprintf(f, "Allocated objects:\n");
  207.     for (i = 0; i < numObjTypes; ++i) {
  208.       if (numAlloc[i] > 0)
  209.     fprintf(f, "  %-20s: %6d\n", objTypeNames[i], numAlloc[i]);
  210.     }
  211.   }
  212. #endif
  213. }
  214.